#!/usr/bin/perl
##########################################################################################################################
##### a script to add object permissions for Users of Wigan-Warriors.com
##########################################################################################################################

##########################################################################################################################
######  TODO list  #######################################################################################################
##########################################################################################################################
##########################################################################################################################

##########################################################################################################################
###### Bug list
##########################################################################################################################
##########################################################################################################################

##########################################################################################################################
# Includes
##########################################################################################################################

use lib qw(../cgi-bin);
use DBI;
use WiganRL;

use strict;
#use warnings;
local $SIG{__WARN__} = \&Carp::cluck;  #full call back trace

$|++;  #unbuffered

my $MAX_BOUNCES= 2;

##########################################################################################################################
# site setup and location variable declarations
##########################################################################################################################
my $cfg= WiganRL::DataObject->load_config('../cgi-bin/wiganrl.ini');
WiganRL::DataObject->cgi_base_url($cfg->val('paths', 'CGI_BASE_URL'));
WiganRL::DataObject->site_base_url($cfg->val('paths', 'SITE_BASE_URL'));
WiganRL::DataObject->site_base_dir($cfg->val('paths', 'SITE_BASE_DIR'));
#WiganRL::DataObject->cachedir($cfg->val('paths', 'SITE_BASE_DIR')."/cached");
WiganRL::DataObject->datadir($cfg->val('paths', 'SITE_DATA_DIR'));
WiganRL::DataObject->template_dir($cfg->val('paths', 'SITE_BASE_DIR')."/templates");
WiganRL::DataObject->dataurl('data');

WiganRL::DataObject->email_dir($cfg->val('emails', 'EMAIL_BASE_DIR'));
WiganRL::DataObject->smtpserver($cfg->val('emails', 'EMAIL_SMTP_SERVER'));
WiganRL::DataObject->smtpusername($cfg->val('emails', 'EMAIL_SMTP_USERNAME'));
WiganRL::DataObject->smtppassword($cfg->val('emails', 'EMAIL_SMTP_PASSWORD'));
WiganRL::DataObject->email_from($cfg->val('emails', 'EMAIL_FROM'));
WiganRL::DataObject->email_replyto($cfg->val('emails', 'EMAIL_REPLYTO'));
WiganRL::DataObject->send_emails($cfg->val('emails', 'SEND_EMAILS'));
WiganRL::DataObject->email_debug($cfg->val('emails', 'EMAIL_DEBUG_MODE'));
WiganRL::DataObject->email_debuguser($cfg->val('emails', 'EMAIL_DEBUG_USER'));

my $cgi= CGI::Simple->new();

my $dbh= Diva::DB->new();
$dbh->set( {
	DATABASE_NAME       => $cfg->val('database', 'DATABASE_NAME'),
	DATABASE_SERVER     => $cfg->val('database', 'DATABASE_SERVER'),
	DATABASE_USERNAME   => $cfg->val('database', 'DATABASE_USERNAME'),
	DATABASE_PASSWORD   => $cfg->val('database', 'DATABASE_PASSWORD'),
	DATABASE_TYPE       => $cfg->val('database', 'DATABASE_TYPE'),
	} );
$dbh->connect();
#$dbh->debug(0);
WiganRL::DataObject->dbh($dbh);
WiganRL::Search->dbh($dbh);
WiganRL::DataObject->init_class('WWCOM');  #loads contenttypes
WiganRL::DataObject->cgi($cgi);

WiganRL::DataObject->user(WiganRL::DataObject::User->new($cfg->val('site','SITE_ADMINUSER')));

#empty session
use CGI::Session;
CGI::Session->name('wrSID');
WiganRL::DataObject->session(CGI::Session->new);


##########################################################################################################################
# connect to bounces mailbox
##########################################################################################################################
use Mail::Box::Manager;
use Mail::DeliveryStatus::BounceParser;

my $mgr= Mail::Box::Manager->new();

my $mdir   = $mgr->open(folder=>'/home/bounces/Maildir','access','rw');

#my $mdir   = Mail::Box::Maildir->new(folder=>'/home/bounces/Maildir');

for my $msg ($mdir->messages) {
	my $head = $msg->head;
 
	my $bounce= Mail::DeliveryStatus::BounceParser->new($msg->string);

	print $msg->subject."\n";
#	if (($head->get('Return-path') eq '<>' or $head->get('Return-path') eq '') and $bounce->is_bounce) {
	if ($bounce->is_bounce) {
		print "\tBounce test passed, should be a bounce\n";
		my @addresses=  $bounce->addresses;
		if ($head->get('X-Failed-Recipients') ne '') {
	        my $found = grep { $_ eq $head->get('X-Failed-Recipients') } @addresses;
			push @addresses,$head->get('X-Failed-Recipients') if (not $found);
		}

		for my $a (@addresses) {
			my $s= WiganRL::Search->new('USER');
			$s->where('USER_EMAIL="'.$dbh->handle->quote($a).'" and USER_ACTIVE="True" and USER_UPDATES<>"None"');
			$cgi->delete('USER_UPDATES');
			$cgi->delete('USER_BOUNCES');
			for my $u (@{$s->search}) {
				print "\tFound user: ".$u->id.", email: ".$u->param('USER_EMAIL').", nbounces: ".$u->param('USER_BOUNCES')."\n";
				if ($u->param('USER_BOUNCES') >= $MAX_BOUNCES) {
					print "\t*** User updates suspended - too many bounces.\n";
					$cgi->param('USER_UPDATES','None');
					$u->update;
				} else {
					$cgi->param('USER_BOUNCES',$u->param('USER_BOUNCES')+1);
					$u->update;
				}
			}
		}
		$msg->delete();
	} 
}

